import { isNumber } from 'baiwusanyu-utils';
import { BROWSER } from 'esm-env';
import type { Dayjs } from 'dayjs';

const timeUnits = [
	['Y', 1000 * 60 * 60 * 24 * 365], // years
	['M', 1000 * 60 * 60 * 24 * 30], // months
	['D', 1000 * 60 * 60 * 24], // days
	['H', 1000 * 60 * 60], // hours
	['m', 1000 * 60], // minutes
	['s', 1000], // seconds
	['S', 1] // million seconds
] as const;

export const getTime = (value: number | Dayjs) => {
	return isNumber(value) ? new Date(value as number).getTime() : value.valueOf();
};

export const formatTime = (timestamp: number, format: string) => {
	let timeLeft = timestamp;
	const escapeRegex = /\[([^\]]*)]/g;

	const replacedText = timeUnits.reduce((current, [name, unit]) => {
		const replaceRegex = new RegExp(`${name}+(?![^\\[\\]]*\\])`, 'g');
		if (replaceRegex.test(current)) {
			const value = Math.floor(timeLeft / unit);
			timeLeft -= value * unit;
			return current.replace(replaceRegex, (match) => String(value).padStart(match.length, '0'));
		}
		return current;
	}, format);

	return replacedText.replace(escapeRegex, '$1');
};

export const rAF = (fn: () => void) =>
	BROWSER ? window.requestAnimationFrame(fn) : (setTimeout(fn, 16) as unknown as number);

export const cAF = (handle: number) =>
	BROWSER ? window.cancelAnimationFrame(handle) : clearTimeout(handle);
